from .option import get_options, save_options
from .utils import *
from .trainer import BasicEvaluator
import os

def parameter_check(opt, root_path):
    part_info_str = []
    # 全局配置检查
    if opt.get("global", None) is None:
        opt["global"] = {}
        part_info_str.append("配置文件 global 关键字不存在，自动进行创建")
    if opt["global"].get("name", None) is None:
        opt["global"]["name"] = "default"
        global_name = opt["global"]["name"]
        part_info_str.append(f"global配置 name 关键字不存在，自动进行创建[{global_name}]")
    pro_name = opt["global"]["name"]
    if opt["global"].get("logger_name", None) is None:
        opt["global"]["logger_name"] = logger_base_name
        part_info_str.append(f"global配置 logger_name 关键字不存在，自动创建{logger_base_name}")
    # 保存路径的检查
    if opt.get("save", None) is None:
        part_info_str.append("配置文件 save 关键字不存在，自动进行创建")
        opt["save"] = {}
    if opt["save"].get("save_path", None) is None:
        save_path = os.path.join(root_path, f"Checkpoint/{pro_name}")
        opt["save"]["save_path"] = save_path
        part_info_str.append(f"save_path 使用默认配置[{save_path}]")
    save_path = opt["save"]["save_path"]
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    if opt["save"].get("logger_path", None) is None:
        logger_path = os.path.join(save_path, "eval_run.log")  # TODO：需要更准确的日志名称
        opt["save"]["logger_path"] = logger_path
        part_info_str.append(f"logger_path 使用默认配置[{logger_path}]")
    return opt, part_info_str


def eval_pipline(root_path, yaml_path=None):
    if isinstance(yaml_path, str):
        opt = get_options(yaml_path).opt
    else:
        opt = get_options().opt

    opt, check_info = parameter_check(opt, root_path)  # 一些参数检查
    logger = logger_init(opt["global"]["logger_name"], opt["save"]["logger_path"])  # 初始化logger
    for info in check_info:                                             # 输出参数检查信息
        logger.warning(info)
    BasicEvaluator(opt).eval()
